home *** CD-ROM | disk | FTP | other *** search
/ QRZ! Ham Radio 8 / QRZ Ham Radio Callsign Database - Volume 8.iso / pc / files / t_unix / j109lxa4.tar / timed.c < prev    next >
C/C++ Source or Header  |  1994-06-04  |  2KB  |  113 lines

  1. /* Internet Time Server
  2.  * Author: Brian K. Teravskis, WD0EFL
  3.  * Date: 02/15/92
  4.  *
  5.  * Based on RFC868 Time Protocol
  6.  */
  7. #include <stdio.h>
  8. #include <string.h>
  9. #include <time.h>
  10. #include "global.h"
  11. #include "mbuf.h"
  12. #include "socket.h"
  13. #include "session.h"
  14. #include "proc.h"
  15. #include "commands.h"
  16.  
  17. #ifdef __GNUC__
  18. #define DIFFTIME 2208988800LU
  19. #else
  20. #define DIFFTIME 2208988800
  21. #endif
  22. #define IPPORT_TIME 37
  23.  
  24. static int Stime = -1;    /* Prototype socket for service */
  25.  
  26. static void timeserver __ARGS((int s,void *unused,void *p));
  27.  
  28. /* Start up time server */
  29. int
  30. #ifdef PROTOTYPES
  31. time1(int argc,char **argv,void *p)
  32. #else
  33. time1(argc,argv,p)
  34. int argc;
  35. char *argv[];
  36. void *p;
  37. #endif
  38. {
  39.     struct sockaddr_in lsocket;
  40.     int s;
  41.  
  42.     if(Stime != -1){
  43.         return 0;
  44.     }
  45.     psignal(Curproc,0);    /* Don't keep the parser waiting */
  46.     chname(Curproc,"Time listener");
  47.  
  48.     lsocket.sin_family = AF_INET;
  49.     lsocket.sin_addr.s_addr = INADDR_ANY;
  50.     lsocket.sin_port = IPPORT_TIME;
  51.  
  52.     Stime = socket(AF_INET,SOCK_STREAM,0);
  53.     bind(Stime,(char *)&lsocket,sizeof(lsocket));
  54.     listen(Stime,1);
  55.     for(;;){
  56.         if((s = accept(Stime,NULLCHAR,(int *)NULL)) == -1)
  57.             break;    /* Service is shutting down */
  58.  
  59.         /* Spawn a server */
  60.         newproc("timeserver",512,timeserver,s,NULL,NULL,0);
  61.     } /* for (;;;) */
  62.     return 0;
  63. } /* time1 */
  64.  
  65.  
  66.  
  67. /*
  68.  * Serve up the time to the connected client
  69.  */
  70. static void
  71. timeserver(s,unused,p)
  72. int s;
  73. void *unused;
  74. void *p;
  75. {
  76.     struct mbuf    *bp;
  77.     char    datetime[4];
  78.  
  79.     sockmode(s,SOCK_BINARY);
  80.     sockowner(s,Curproc);
  81.     log(s,"Open Time");
  82.     /*
  83.      * Change 1970 start time to 1900 start time, and put
  84.      * it in network order
  85.      */
  86.     put32(datetime,(int32)(time((time_t *)0)+DIFFTIME));
  87.  
  88.     /* enqueue for transmission */
  89.     bp = qdata(datetime,sizeof(int32));
  90.     /* Send time data */
  91.     if(send_mbuf(s,bp,0,NULLCHAR,0) == -1)
  92.         log(s,"Time Failed");
  93.  
  94.     close_s(s);
  95.     log(s,"Close Time");
  96. } /* timeserver */
  97.  
  98. /* Stop the time server */
  99. int
  100. #ifdef PROTOTYPES
  101. time0(int argc,char **argv,void *p)
  102. #else
  103. time0(argc,argv,p)
  104. int argc;
  105. char *argv[];
  106. void *p;
  107. #endif
  108. {
  109.     close_s(Stime);
  110.     Stime = -1;
  111.     return 0;
  112. } /* time0 */
  113.